package top.ddandang.blog.service;

import top.ddandang.blog.model.pojo.Article;
import com.baomidou.mybatisplus.extension.service.IService;
import top.ddandang.blog.model.query.PageBean;
import org.springframework.web.multipart.MultipartFile;
import top.ddandang.blog.model.vo.*;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author D
 * @since 2020-06-23
 */
public interface ArticleService extends IService<Article> {

    /**
     *  增加文章
     * @param title 文章标题
     * @param contentHtml 文章Html内容
     * @param contentMd 文章Md内容
     * @param categoryId 文章分类Id
     * @param description 文章简要描述
     * @param allowComment 是否允许评论
     * @return 返回增加的文章Id
     */
    int insertArticle(String title, String contentHtml, String contentMd, int categoryId, String description,boolean allowComment);

    /**
     * 更新文章 只更新内容，描述，标签，是否允许评论
     * @param articleVo 更细的数据
     * @return 影响行数
     */
    int updateArticle(ArticleVo articleVo);

    /**
     * 文章插入图片
     * @param file 图片
     * @return 图片地址
     */
    String insertImage(MultipartFile file);

    /**
     * 分页根据标签获取首页展示的文章信息
     * 用map指定是什么根据什么分类还是标签进行查询，空的话则查询全部
     * @param pageBean 分页实体类
     * @param tagsId 标签Id
     * @return 文章信息 和 文章总数
     */
    Map<String, Object> listArticleMapByTags(PageBean pageBean, Integer tagsId);

    /**
     * 分页获取首页展示的文章信息
     * 用map指定是什么根据什么分类还是标签进行查询，空的话则查询全部
     * @param pageBean 分页实体类
     * @param map 有categoryId 分类Id tagsId 标签id  两个不可以同时存在
     * @return 文章信息 和 文章总数
     */
    Map<String, Object> listIndexVo(PageBean pageBean, Map<String, Object> map);

    /**
     * 根据文章标题去模糊查询 （小程序使用）
     * @param title 文章标题
     * @return 文章数据
     */
    List<IndexVo> listIndexVoByTitle(String title);

    /**
     * 获取文章的总数
     * @return 文章的总数
     */
    int getArticleCount();

    /**
     * 根据分类Id获取分类中展示文章的内容
     * @param categoryId 分类ID
     * @return 文章内容 包含Id 标题 和简要描述
     */
    List<ClassificationVo> listClassificationVoByCategoryId(Integer categoryId);


    /**
     * 根据标签Id获取分类中展示文章的内容
     * @param tagsId 标签Id
     * @return 文章内容 包含Id 标题 和简要描述
     */
    List<ClassificationVo> listClassificationVoByTagsId(Integer tagsId);

    /**
     * 移除文章的分类
     * @param articleId 文章的ID
     * @return 操作影响的行数
     */
    int removeArticleCategory(Integer articleId);

    /**
     * 查询出分类为null的文章
     * @return ClassificationVo Array List
     */
    List<ClassificationVo> listArticleCategoryIsNull();

    /**
     * 批量增加文章的分类
     * @param categoryId 分类的id
     * @param articleId 文章的id 数组
     */
    void addArticleCategory(Integer categoryId, Integer[] articleId);

    /**
     * 根据文章Id 获取文章信息
     * @param articleId 文章id
     * @return 文章信息
     */
    ArticleDetailVo getArticleById(Integer articleId);

    /**
     * 根据分类id获取该分类中的文章
     * @param categoryId 分类id
     * @return 文章列表
     */
    List<Article> listArticleByCategoryId(Integer categoryId);


    /**
     * 获取管理页面的文章疯转的信息
     * @param map 筛选的条件
     * @return 文章信息
     */
    List<ManageVo> listManageVo(Map<String, Object> map);

    /**
     * 更新文章的允许评论状态
     * @param articleId 文章id
     * @param allowComment 是否允许评论
     * @return 影响行数
     */
    int updateArticleAllowComment(Integer articleId, Boolean allowComment);

    /**
     * 更新文章的允许是否置顶状态
     * @param articleId 文章id
     * @param top 是否置顶
     * @return 影响行数
     */
    int updateArticleTop(Integer articleId, Boolean top);

    /**
     * 逻辑删除文章
     * @param articleId 文章id
     * @return 影响行数
     */
    int deleteArticle(Integer articleId);

    /**
     * 获取推荐文章 topping = true
     * @return 数据
     */
    List<Article> recommendArticles();
}
